iT邦幫忙

2021 iThome 鐵人賽

DAY 18
1

  今天介紹的Adapter Pattern是屬於結構型模式,以字面上來說不難猜到它是用來讓物件與物件之間能夠協同合作,至於它是怎麼運作的,現在就一起來認識吧!


問題情境與解析

  舉一個最貼近生活的例子,那就是充電頭與插座,每當要出國的時候,行李裡面一定要有的是手機充電器,不過每個國家的充電插座規格都不盡相同,為了要讓我們的充電頭與插座可以相容,就一定要有特定的轉接頭,才能讓手機充電。

  Adapter的角色就是一個轉接頭,為了讓充電頭可以符合其他國家的插座規格,就得需要有符合該插座的充電頭(Adaptee)的行為模式(method),使原本的充電頭可以套用,如此來達到使用者的目的,也就是在其他國家充電。

  再來Adapter有分成兩種,一個是Object Adapter,另一個則是Class Adapter,前者實現了一個物件的介面並包含另一個;而後者須用多重繼承來實現它,也就是要用支援多重繼承的程式語言來實現,如果還不是很清楚的話,可以看以下的Class Diagram來了解他們之間微妙的差異。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210930/201407437BnZUbsiT5.png

https://ithelp.ithome.com.tw/upload/images/20210930/20140743PWe2bnaphL.png

Skeleton Code

interface Target {
    public void operation();
}

class Target1 implements Target {
    public void operation() {
        // do something
    }
}

class Adapter implements Target {
    Adaptee adaptee;
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void operation() {
        adaptee.specialOperater();
    }
}

class Adaptee {
    public void specialOperater() {
        // do something
    }
}

  因為有許多程式語言都不支援多重繼承,所以上面的程式碼範例使用的是Object Adapter。當遇到某些功能無法添加到父類別來讓子類別重用時,就可以將這些缺少的功能放到Adapter內,來滿足子類別。


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 17-State 狀態模式
下一篇
IT鐵人DAY 19-Flyweight 享元模式
系列文
淺談物件導向與Design Pattern介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
juck30808
iT邦研究生 1 級 ‧ 2021-10-03 20:03:43

終於要邁入2字頭的天數啦~

2
Tilda
iT邦新手 4 級 ‧ 2021-10-04 09:57:51

精神狀況不穩定ㄌ

我要留言

立即登入留言